﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using Entidades;
using System.Collections;
using System.Data.SqlClient;

namespace CapaDatos.Adapters
{
  public  class AlumnoAdapter
    {

        BDRinconLuzEntities contexto;

        public AlumnoAdapter()
        {
            contexto = RinconLuzContext.Context;
        }

        public AlumnoAdapter(string edicion)
        {
            contexto = RinconLuzContext.ContextNew;
        }


         public void Agregar(Alumno entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            if (entidad.ChangeTracker != null && entidad.ChangeTracker.State == ObjectState.Added)
            {
                contexto.RegistrarCambios(entidad);
                contexto.RealizarCambios();
            }
        }

         public void Eliminar(Alumno entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            IObjectSet<Alumno> objectSet = contexto.CrearSet<Alumno>();

            objectSet.Attach(entidad);
            objectSet.DeleteObject(entidad);
        }



         public void Modificar(Alumno entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            if (entidad.ChangeTracker != null && (entidad.ChangeTracker.State & ObjectState.Deleted) != ObjectState.Deleted)
            {
                entidad.MarkAsModified();
            }

            contexto.RegistrarCambios(entidad);
            contexto.SaveChanges();
        }


        public IEnumerable<Alumno> Obtener()
        {
            return contexto.CrearSet<Alumno>();
        }

        public Alumno ObtenerEntidad(Guid idAlumno)
        {

            var ExisteEntidad = (from v in contexto.Alumno
                                 where v.LegajoAlumno == idAlumno &&
                                        v.Eliminado != true
                                 select v).Any();

            if (ExisteEntidad == true)
            {
                var Entidad = (from v in contexto.Alumno.Include("AlergiasAlumno").Include("AlumnoAlimentacion").Include("AlumnoFamiliares").Include("EnfermedadesAlumno").Include("AlumnoInstitucion").Include("AlumnoNacimiento").Include("AlumnoSalud").Include("AlumnoVidaFamiliar").Include("InscripcionesCiclosLectivos").Include("HermanosAlumno").Include("AlumnoHabitos").Include("AlumnoVidaSocial")
                               where v.LegajoAlumno == idAlumno &&
                                     v.Eliminado != true
                               select v).First();
                return Entidad;
            }
            else
            {
                Alumno Entidad = null;
                return Entidad;
            }
           

        }

        public bool ExisteDNI(string dni, Guid legajo)
        {
            var query = (from v in contexto.Alumno
                         where v.DniAlumno == dni &&
                         v.LegajoAlumno != legajo &&
                         v.Eliminado != true
                         select v).Any();

            return query;

        }

        public bool ExisteEntidad(Guid legajo)
        {
            var query = (from v in contexto.Alumno
                         where  v.LegajoAlumno == legajo &&
                         v.Eliminado != true
                         select v).Any();

            return query;

        }

        public bool VerificarRelacionFamiliar(Guid legajoAlumno, Guid legajoFamiliar, Guid idParentesco)
        {
            var existe = (from v in contexto.AlumnoFamiliar
                          where v.LegajoAlumno == legajoAlumno &&
                                v.LegajoFamiliar == legajoFamiliar &&
                                v.IdParentesco == idParentesco
                          select v).Any();

            return existe;



        }


        public List<ViewEntity> ObtenerEntidades(string dni, string nombre, string apellido)
        {
            List<ViewEntity> Entidades = null;

            if (!String.IsNullOrWhiteSpace(dni))
            {

                var ExistenEntidades = (from v in contexto.Alumno
                                        where v.DniAlumno.Contains(dni) &&
                                            v.Eliminado != true
                                        select v).Any();

                if (ExistenEntidades == true)
                {
                    var Lista = (from v in contexto.Alumno.Include("AlergiasAlumno").Include("AlumnoAlimentacion").Include("AlumnoFamiliares").Include("EnfermedadesAlumno").Include("AlumnoInstitucion").Include("AlumnoNacimiento").Include("AlumnoSalud").Include("AlumnoVidaFamiliar").Include("InscripcionesCiclosLectivos").Include("HermanosAlumno").Include("AlumnoHabitos").Include("AlumnoVidaSocial")
                                where v.DniAlumno.Contains(dni) &&
                                            v.Eliminado != true
                                select v).ToList();

                    Entidades = new List<ViewEntity>();

                    foreach (var item in Lista)
                    {
                        Entidades.Add(new ViewEntity(item.LegajoAlumno, item.ApellidoAlumno + ", " + item.NombreAlumno + " / DNI: " + item.DniAlumno));
                    }
                    return Entidades;

                }
                else
                {
                    return Entidades;
                }

            }
            else
            {
                if (!String.IsNullOrWhiteSpace(nombre) && !String.IsNullOrWhiteSpace(apellido))
                {
                    var ExistenEntidades = (from v in contexto.Alumno
                                            where v.NombreAlumno.Contains(nombre) &&
                                            v.ApellidoAlumno.Contains(apellido) &&
                                            v.Eliminado != true
                                            select v).Any();

                    if (ExistenEntidades == true)
                    {
                        var Lista = (from v in contexto.Alumno.Include("AlergiasAlumno").Include("AlumnoAlimentacion").Include("AlumnoFamiliares").Include("EnfermedadesAlumno").Include("AlumnoInstitucion").Include("AlumnoNacimiento").Include("AlumnoSalud").Include("AlumnoVidaFamiliar").Include("InscripcionesCiclosLectivos").Include("HermanosAlumno").Include("AlumnoHabitos").Include("AlumnoVidaSocial")
                                     where v.NombreAlumno.Contains(nombre) &&
                                        v.ApellidoAlumno.Contains(apellido) &&
                                              v.Eliminado != true
                                     select v).ToList();

                        Entidades = new List<ViewEntity>();

                        foreach (var item in Lista)
                        {

                            Entidades.Add(new ViewEntity(item.LegajoAlumno, item.ApellidoAlumno + ", " + item.NombreAlumno + " / DNI: " + item.DniAlumno));

                        }
                        return Entidades;

                    }
                    else
                    {
                        return Entidades;
                    }



                }
                else
                {
                    if (!String.IsNullOrWhiteSpace(nombre))
                    {
                        var ExistenEntidades = (from v in contexto.Alumno
                                                where v.NombreAlumno.Contains(nombre) &&
                                                v.Eliminado != true
                                                select v).Any();

                        if (ExistenEntidades == true)
                        {
                            var Lista = (from v in contexto.Alumno.Include("AlergiasAlumno").Include("AlumnoAlimentacion").Include("AlumnoFamiliares").Include("EnfermedadesAlumno").Include("AlumnoInstitucion").Include("AlumnoNacimiento").Include("AlumnoSalud").Include("AlumnoVidaFamiliar").Include("InscripcionesCiclosLectivos").Include("HermanosAlumno").Include("AlumnoHabitos").Include("AlumnoVidaSocial")
                                         where v.NombreAlumno.Contains(nombre) &&
                                                  v.Eliminado != true
                                         select v).ToList();

                            Entidades = new List<ViewEntity>();

                            foreach (var item in Lista)
                            {
                                Entidades.Add(new ViewEntity(item.LegajoAlumno, item.ApellidoAlumno + ", " + item.NombreAlumno + " / DNI: " + item.DniAlumno));
                            }
                            return Entidades;

                        }
                        else
                        {
                            return Entidades;
                        }



                    }
                    else
                    {
                        if (!String.IsNullOrWhiteSpace(apellido))
                        {
                            var ExistenEntidades = (from v in contexto.Alumno
                                                    where v.ApellidoAlumno.Contains(apellido) &&
                                                    v.Eliminado != true
                                                    select v).Any();

                            if (ExistenEntidades == true)
                            {
                                var Lista = (from v in contexto.Alumno.Include("AlergiasAlumno").Include("AlumnoAlimentacion").Include("AlumnoFamiliares").Include("EnfermedadesAlumno").Include("AlumnoInstitucion").Include("AlumnoNacimiento").Include("AlumnoSalud").Include("AlumnoVidaFamiliar").Include("InscripcionesCiclosLectivos").Include("HermanosAlumno").Include("AlumnoHabitos").Include("AlumnoVidaSocial")
                                             where v.ApellidoAlumno.Contains(apellido) &&
                                                      v.Eliminado != true
                                             select v).ToList();

                                Entidades = new List<ViewEntity>();


                                foreach (var item in Lista)
                                {
                                    Entidades.Add(new ViewEntity(item.LegajoAlumno, item.ApellidoAlumno + ", " + item.NombreAlumno + " / DNI: " + item.DniAlumno));
                                }
                                return Entidades;

                            }
                            else
                            {
                                return Entidades;
                            }

                        }
                        else
                        {

                            var ExistenEntidades = (from v in contexto.Alumno
                                                    where v.Eliminado != true
                                                    select v).Any();

                            if (ExistenEntidades == true)
                            {
                                var Lista = (from v in contexto.Alumno.Include("AlergiasAlumno").Include("AlumnoAlimentacion").Include("AlumnoFamiliares").Include("EnfermedadesAlumno").Include("AlumnoInstitucion").Include("AlumnoNacimiento").Include("AlumnoSalud").Include("AlumnoVidaFamiliar").Include("InscripcionesCiclosLectivos").Include("HermanosAlumno").Include("AlumnoHabitos").Include("AlumnoVidaSocial")
                                             where v.Eliminado != true
                                             select v).ToList();

                                Entidades = new List<ViewEntity>();


                                foreach (var item in Lista)
                                {
                                    Entidades.Add(new ViewEntity(item.LegajoAlumno, item.ApellidoAlumno + ", " + item.NombreAlumno + " / DNI: " + item.DniAlumno));
                                }
                                return Entidades;

                            }
                            else
                            {
                                return Entidades;
                            }


                        }
                    }


                }



            }
        }

        public void EliminarRelacionesFamiliares(Guid idAlumno)
        {

            var ExistenEntidades = (from v in contexto.AlumnoFamiliar
                                    where v.LegajoAlumno == idAlumno
                                    select v).Any();

            if (ExistenEntidades == true)
            {
                int i = contexto.ExecuteStoreCommand("Exec SP_Alumno_EliminarRelaciones @LegajoAlumno", new SqlParameter("LegajoAlumno", idAlumno));

            }


        }



        public List<InformeListaAlumnos> GenerarInformeListaAlumnos(Guid idTurno)
        {

            List<InformeListaAlumnos> Entidades = new List<InformeListaAlumnos>();


            var Alumnos = (from v in contexto.InscripcionCicloLectivo
                           where v.Turno.CicloLectivo.FechaDesde.Value.Year == DateTime.Now.Year &&
                           v.Turno.IdTurno == idTurno &&
                           v.Eliminada != true
                           select v.Alumno.LegajoAlumno).ToList();


            if (Alumnos.Count() > 0)
            {
                var Lista = (from v in contexto.Alumno
                             where Alumnos.Contains(v.LegajoAlumno)
                             select v).ToList();

                foreach (var item in Lista)
                {
                    Entidades.Add(new InformeListaAlumnos(item.ApellidoAlumno + ", " + item.NombreAlumno));

                }
            }

            return Entidades;


        }



        public List<ViewEntity> ObtenerAlumnosCiclo(Guid idCicloLectivo)
        {
            List<ViewEntity> Entidades = new List<ViewEntity>();

            var Alumnos = (from v in contexto.InscripcionCicloLectivo
                           where v.Turno.CicloLectivo.IdCicloLectivo == idCicloLectivo &&
                           v.Eliminada != true
                           select v.Alumno.LegajoAlumno).ToList();

            if (Alumnos.Count() > 0)
            {
                var Lista = (from v in contexto.Alumno
                             where Alumnos.Contains(v.LegajoAlumno)
                             select v).ToList();

           
                foreach (var item in Lista)
                    Entidades.Add(new ViewEntity(item.LegajoAlumno, item.ApellidoAlumno + ", " + item.NombreAlumno + " / DNI: " + item.DniAlumno));

            }

            return Entidades;

        }


        public List<ViewEntity> ObtenerAlumnosInscripcion(Guid idCicloLectivo)
        {
            List<ViewEntity> Entidades = new List<ViewEntity>();

            var Alumnos = (from v in contexto.InscripcionCicloLectivo.Include("Alumno")
                           where v.Turno.CicloLectivo.IdCicloLectivo == idCicloLectivo &&
                           v.Eliminada != true
                           select v).ToList();

            if (Alumnos.Count() > 0)
            {
                foreach (var item in Alumnos)
                    Entidades.Add(new ViewEntity(item.IdInscripcionCicloLectivo, item.Alumno.ApellidoAlumno + ", " + item.Alumno.NombreAlumno + " / DNI: " + item.Alumno.DniAlumno));

            }

            return Entidades;

        }





    }
}
